package com.neo.push.server.handler;
import com.neo.push.server.exception.ConnectionIdleException;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.handler.timeout.IdleStateHandler;

/**
 * Created by lock on 17-7-11.
 */
public class TimeoutHandler extends IdleStateHandler {

    /**
     * 间隔多少秒内，前端没有给服务器发送心跳，则认为前端断线，将把当前连接移除
     * @param timeoutSeconds    心跳超时
     */
    public TimeoutHandler(int timeoutSeconds) {
        super(timeoutSeconds, 0,0);
    }


    /**
     * 可以在这里做 read idle 次数控制，如果超过几次，则进行关闭，需要在 channel read 里面重置超时次数
     * @param ctx
     * @param evt
     * @throws Exception
     */
    @Override
    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {
        if(evt.state()== IdleState.READER_IDLE){
            String channelId = ctx.channel().id().asLongText();
            throw new ConnectionIdleException(" channel  "+channelId+" is read idle ");
        }else{
            super.channelIdle(ctx, evt);
        }
    }
}

